<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
      思路：快慢指针。定义两个指针fast和head，让fast先走n步。然后同时走，等到fast走到末尾
      这时候就是删除链表的某个元素 即删除 slow.next  让slow.next=slow.next.next
      需要定义一个虚拟头节点，因为可能要删除的就是首节点
      */
      var removeNthFromEnd = function (head, n) {
        let dummy = new ListNode(null, head)
        let fast = head
        let slow = head
        while (n--) {
          fast = fast.next
        }
        if (!fast) {
          return slow.next
        }
        /* 
        为什么需要fast.next存在 因为fast.next最后是fast到了链表最后一个节点 
        如果没有的话，最后fast会变为了null
        1 2 3 4 5 删除 倒数第二个
        如果没有fast.next slow指针会变成4 fast会变成null这就不合理了
        有的话  slow变成3 fast变成5就退出了循环了，正好删除4
        */
        while (fast && fast.next) {
          fast = fast.next
          slow = slow.next
        }
        let next = slow.next.next
        slow.next = next
        return dummy.next
      }
    </script>
  </body>
</html>
